<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>InitPHP框架 PHP框架 - A PHP Framework - DAO数据层使用</title>
<link href="static/common.css" type="text/css" rel="stylesheet" />
<meta name="keywords" content="php框架，国产php框架, initphp框架，MVC，分层体系" />
<meta name="description" content="initphp框架是一款国产php框架。initphp框架主要基于MVC模式，具备代码清晰，操作简单，功能齐全，开发快速，高效安全等特点，是您选择php框架的首选。" />
</head>
<body>
<div class="header">
  <div class="header_nav">InitPHP (A PHP Framework) 用户手册</div>
  <div class="header_div">
    <div class="header_title">第4章 4.2 DAO数据层使用</div>
    <div class="header_right"><a href="4_1.htm">上一页</a> <a href="4_3.htm">下一页</a> </div>
  </div>
</div>
<div class="title">
  <h3>详细说明：</h3>
</div>
<ul>
  <li>Dao定义：数据处理层，主要负责操作数据和数据缓存。</li>
  <li>InitPHP框架的DAO层提供了丰富的数据库操作接口和缓存接口。详细可参考API文档。</li>
  <li>所有的Dao需要继承InitPHP框架提供的框架基类Dao</li>
  <li><span style="color:#FF0000">建议使用Zend Studio工具开发，有代码提示功能，能将所有的API提示显示，方便您的开发速度</span></li>
</ul>
<div class="title">
  <h3>API使用：</h3>
</div>
<ul>
  <li>Dao类中使用InitPHP框架的API主要分为两个部分，一个是缓存，一个是DB操作</li>
  <li>缓存操作$this->dao->cache->：缓存现在提供三种缓存，MYSQL缓存，文件缓存，MEMCACHE缓存，有统一的缓存接口。缓存的API接口暂时提供四个最常用的。</li>
  <li>DB操作$this->dao->db->：DB接口提供了丰富的数据库操作接口，包括：sql_build接口，DB操作接口，分表分库函数接口和常用DB函数接口（例如：get_one()）</li>
</ul>
<pre id="PHP" class="prettyprint">
class testDao extends Dao {
	public function test() {
		$this->dao->cache->set('test', '缓存的值', 0, 'FILE'); //缓存接口使用方法
		$this->dao->db->insert(array('name' => 'cccccccc'), 'test'); //DB接口使用方法
		print_r($this->dao->db->get_all('test'));
	}
}
</pre>
<div class="title">
  <h3>应用配置：</h3>
</div>
<ul>
  <li>将&nbsp;<img src="static/page.gif" />&nbsp;initphp/initphp.conf.php&nbsp;&nbsp;中的DAO配置拷贝到应用配置文件中&nbsp;&nbsp;<img src="static/page.gif" />&nbsp;conf/conf.php</li>
  <li>配置信息暂时分为三部分：DAO配置、缓存配置和数据库配置</li>
  <li>DAO配置：主要配置Dao类存放的目录和Dao类名的后缀名称。</li>
  <li>缓存配置：如果你使用memcache缓存则需要配置memcache服务器，文件缓存需要配置文件缓存目录</li>
  <li>数据库配置：主要配置数据库信息</li>
</ul>
<pre id="PHP" class="prettyprint">
/**
 * Dao配置参数
 * 1. 你可以配置Dao的路径和文件（类名称）的后缀名
 * 2. 一般情况下您不需要改动此配置
 */
$InitPHP_conf['dao']['dao_postfix']  = 'Dao'; //后缀
$InitPHP_conf['dao']['path']  = 'library/dao/'; //后缀
/**
 * 缓存配置参数
 * 1. 您如果使用缓存 需要配置memcache的服务器和文件缓存的缓存路径
 * 2. memcache可以配置分布式服务器，根据$InitPHP_conf['memcache'][0]的KEY值去进行添加
 * 3. 根据您的实际情况配置
 */
$InitPHP_conf['memcache'][0]   = array('127.0.0.1', '11211');  
$InitPHP_conf['cache']['filepath'] = 'data/filecache';   //文件缓存目录
/**
 * 数据库配置
 * 1. 根据项目的数据库情况配置
 * 2. 支持单数据库服务器，读写分离，随机分布的方式
 * 3. 可以根据$InitPHP_conf['db'][0]['driver'] 选择mysql mysqli（暂时支持这两种）
 * 4. 支持多库配置 $InitPHP_conf['db_multi']['test']
 * 5. 详细见文档
 */
$InitPHP_conf['db']['driver']                	 		   = 'mysqli'; //mysql,mysqli 默认必填
$InitPHP_conf['db']['default']['db_type']				   = 2; //0-单个服务器，1-读写分离，2-随机
$InitPHP_conf['db']['default'][0]['host']                  = '127.0.0.1'; //主机
$InitPHP_conf['db']['default'][0]['username']              = 'root'; //数据库用户名
$InitPHP_conf['db']['default'][0]['password']              = '1234562'; //数据库密码
$InitPHP_conf['db']['default'][0]['database']              = 'test'; //数据库
$InitPHP_conf['db']['default'][0]['charset']               = 'utf8'; //数据库编码   
$InitPHP_conf['db']['default'][0]['pconnect']              = 0; //是否持久链接

$InitPHP_conf['db']['default2']['db_type']				   = 1; //0-单个服务器，1-读写分离，2-随机
$InitPHP_conf['db']['default2'][0]['host']                  = '127.0.0.1'; //主机
$InitPHP_conf['db']['default2'][0]['username']              = 'root'; //数据库用户名
$InitPHP_conf['db']['default2'][0]['password']              = '123456'; //数据库密码
$InitPHP_conf['db']['default2'][0]['database']              = 'test'; //数据库
$InitPHP_conf['db']['default2'][0]['charset']               = 'utf8'; //数据库编码   
$InitPHP_conf['db']['default2'][0]['pconnect']              = 0; //是否持久链接
$InitPHP_conf['db']['default2'][1]['host']                  = '127.0.0.1'; //主机
$InitPHP_conf['db']['default2'][1]['username']              = 'root'; //数据库用户名
$InitPHP_conf['db']['default2'][1]['password']              = '123456'; //数据库密码
$InitPHP_conf['db']['default2'][1]['database']              = 't1'; //数据库
$InitPHP_conf['db']['default2'][1]['charset']               = 'utf8'; //数据库编码   
$InitPHP_conf['db']['default2'][1]['pconnect']              = 0; //是否持久链接 

$InitPHP_conf['db']['test2']['db_type']				  	= 0; //0-单个服务器，1-读写分离，2-随机
$InitPHP_conf['db']['test2'][0]['host']                  = '127.0.0.1'; //主机
$InitPHP_conf['db']['test2'][0]['username']              = 'root'; //数据库用户名
$InitPHP_conf['db']['test2'][0]['password']              = '123456'; //数据库密码
$InitPHP_conf['db']['test2'][0]['database']              = 't1'; //数据库
$InitPHP_conf['db']['test2'][0]['charset']               = 'utf8'; //数据库编码   
$InitPHP_conf['db']['test2'][0]['pconnect']              = 0; //是否持久链接 
</pre>
<div class="title">
  <h3>调用Dao类：</h3>
</div>
<ul>
  <li>InitPHP框架提供了一个<span style="color:#FF0000">InitPHP::getDao()</span> 全局API函数，可以直接单例-实例化Dao</li>
  <li>接口有两个参数，第一个参数是Dao的类名称，不需要带后缀'Dao'；第二个参数是文件夹路径，默认Dao都是放在<img src="static/folderopen.gif" />&nbsp;&nbsp;&nbsp;&nbsp;lib/dao/文件夹下的，也会碰到项目比较庞大，将Dao类进行分类，比如分成User的类，那么文件夹目录<img src="static/folderopen.gif" />&nbsp;&nbsp;&nbsp;&nbsp;lib/dao/user/</li>
  <li>InitPHP::getService和InitPHP::getDao两个接口的用法类似。全局都可以使用。如果用户采用MVC模式，直接在Controller中直接导入Dao即可。</li>
</ul>
<pre id="PHP" class="prettyprint">
/**
 * 【静态】获取Dao-实例并且单例模式获取Dao
 * 1.单例模式获取
 * 2.可以选定Dao路径path
 * 3. dao需要在配置文件中配置参数，$path对应dao目录中的子目录
 * 全局使用方法：InitPHP::getDao($daoname, $path = '') 
 * @param string $daoname 服务名称
 * @param string $path 路径
 * @return object
 */
public static function getDao($daoname, $path = '') {
	global $InitPHP_conf;
	$path  = ($path == '') ? '' : $path . '/';
	$class = $daoname . $InitPHP_conf['dao']['dao_postfix'];
	$file  = rtrim($InitPHP_conf['dao']['path'], '/') . '/' . $path . $class . '.php';
	if (!InitPHP::import($file)) return false;
	$obj = InitPHP::loadclass($class);
	return $obj;
}
</pre>
<div class="title">
  <h3>新增DB驱动：</h3>
</div>
<ul>
  <li>InitPHP暂时只支持mysql和mysqli。如果用户需要支持sqlservice之类的，可以自己扩展。</li>
  <li>DB驱动目录：<img src="static/folderopen.gif" />&nbsp;&nbsp;&nbsp;&nbsp;initphp/core/dao/db/driver/文件夹下</li>
  <li>扩展的话，文件名称为：驱动名称 + '.init.php'，类名称：驱动名称+'Init'。必须要继承dbbaseInit基类，然后实现里面的抽象方法。</li>
  <li>驱动的使用： $InitPHP_conf['db']['driver'] = 'mysqli'; //默认mysql 可以不填该参数</li>
</ul>
<div class="title">
  <h3>分表分库：</h3>
</div>
<ul>
  <li>数据库数据量比较庞大的时候，就需要做分表分库的处理。分表和分库操作是有一定的讲究的，InitPHP中提供了三个常用的分表分库公用函数。</li>
</ul>
<pre id="PHP" class="prettyprint">
/**
 * 按月分表-分库方法
 * 1. 当数据表数据量过大的时候，可以根据按月分表的方法来进行分表
 * 2. 按月分库会根据当前的时间来决定是几月份的数据
 * 3. 按月分库$defaultId，可以自定义填入月份，例如：get_mon_table('test', 2),则返回 test_02
 * Dao中使用方法：$this->dao->db->month_identify($tbl, $defaultId = '')
 * @param string $tbl
 * @param string $defaultId
 */
public function month_identify($tbl, $defaultId = '') {
	if (empty ( $defaultId )) {
		$mon = sprintf ( '%02d', date ( 'm', InitPHP::getTime() ));
		return $tbl . '_' . $mon;
	} else {
		return $tbl . '_' . sprintf ( '%02d', $defaultId );
	}
}

/**
 * 根据数值来确定分表-分库方法
 * 1. 可以自定义分表-分库的模板前缀$tbl变量
 * 2. 可以自定义截取长度
 * 3. 一般可以根据用户UID来获取分表或者分库
 * Dao中使用方法：$this->dao->db->num_identify($num, $tbl, $default = 1)
 * @param int $num     数值
 * @param string $tbl  模板前缀
 * @param int $default 默认截取长度
 */
public function num_identify($num, $tbl, $default = 1) {
	$num = (string) $num;
	$len = strlen($num);
	if ($len >= $default)
		$str = substr($num, $len - $default, $default);
	else
		$str = str_pad($num, $default, '0', STR_PAD_LEFT); 
	return $tbl . '_' . $str;
}

/**
 * 求余数的方式获取分表-分库方法
 * 1. 求余方式余数比较少，适合小型的分表法
 * 2. 可以自定义求余除数
 * Dao中使用方法：$this->dao->db->fmod_identify($num, $tbl, $default = 7)
 * @param int $num
 * @param string $tbl
 * @param int $default
 * @return 
 */
public function fmod_identify($num, $tbl, $default = 7) {
	return $tbl . '_' . fmod($num/$default);
}
 </pre>
<div class="title">
  <h3>分布式数据库处理：</h3>
</div>
<ul>
  <li>InitPHP的数据库操作，通过改变配置文件，轻松实现主从、随机分布和单数据库服务器之间的切换。</li>
  <li>配置参数：$InitPHP_conf['db']['default']['db_type'] = 0; //0-单个服务器，1-读写分离，2-随机</li>
  <li>主从：$InitPHP_conf['db']['default'][$key]，主服务器的是写数据库的服务器，$key值默认为0，从服务器（读取操作，一般读取操作压力比较大）的为$key值大于0的随机一台</li>
  <li>随机分布：$InitPHP_conf['db']['default'][$key]，会随机选择一个$key值</li>
</ul>
<pre id="PHP" class="prettyprint">
/* 单数据库配置文件配置方案，默认为default： */
$InitPHP_conf['db']['driver']                	 		   = 'mysqli'; //mysql,mysqli 默认必填
$InitPHP_conf['db']['default']['db_type']				   = 2; //0-单个服务器，1-读写分离，2-随机
$InitPHP_conf['db']['default'][0]['host']                  = '127.0.0.1'; //主机
$InitPHP_conf['db']['default'][0]['username']              = 'root'; //数据库用户名
$InitPHP_conf['db']['default'][0]['password']              = '1234562'; //数据库密码
$InitPHP_conf['db']['default'][0]['database']              = 'test'; //数据库
$InitPHP_conf['db']['default'][0]['charset']               = 'utf8'; //数据库编码   
$InitPHP_conf['db']['default'][0]['pconnect']              = 0; //是否持久链接
/**********************************************************************/

/* 主从数据库配置文件方案 */
$InitPHP_conf['db']['default2']['db_type']				    = 1; //0-单个服务器，1-读写分离，2-随机
$InitPHP_conf['db']['default2'][0]['host']                  = '127.0.0.1'; //主机
$InitPHP_conf['db']['default2'][0]['username']              = 'root'; //数据库用户名
$InitPHP_conf['db']['default2'][0]['password']              = '123456'; //数据库密码
$InitPHP_conf['db']['default2'][0]['database']              = 'test'; //数据库
$InitPHP_conf['db']['default2'][0]['charset']               = 'utf8'; //数据库编码   
$InitPHP_conf['db']['default2'][0]['pconnect']              = 0; //是否持久链接

$InitPHP_conf['db']['default2'][1]['host']                  = '127.0.0.1'; //主机
$InitPHP_conf['db']['default2'][1]['username']              = 'root'; //数据库用户名
$InitPHP_conf['db']['default2'][1]['password']              = '123456'; //数据库密码
$InitPHP_conf['db']['default2'][1]['database']              = 't1'; //数据库
$InitPHP_conf['db']['default2'][1]['charset']               = 'utf8'; //数据库编码   
$InitPHP_conf['db']['default2'][1]['pconnect']              = 0; //是否持久链接 
/**********************************************************************/

/* 随机分布数据库配置文件方案 mysql-cluster适用 */
$InitPHP_conf['db']['default2']['db_type']				    = 2; //0-单个服务器，1-读写分离，2-随机
$InitPHP_conf['db']['default2'][0]['host']                  = '127.0.0.1'; //主机
$InitPHP_conf['db']['default2'][0]['username']              = 'root'; //数据库用户名
$InitPHP_conf['db']['default2'][0]['password']              = '123456'; //数据库密码
$InitPHP_conf['db']['default2'][0]['database']              = 'test'; //数据库
$InitPHP_conf['db']['default2'][0]['charset']               = 'utf8'; //数据库编码   
$InitPHP_conf['db']['default2'][0]['pconnect']              = 0; //是否持久链接

$InitPHP_conf['db']['default2'][1]['host']                  = '127.0.0.1'; //主机
$InitPHP_conf['db']['default2'][1]['username']              = 'root'; //数据库用户名
$InitPHP_conf['db']['default2'][1]['password']              = '123456'; //数据库密码
$InitPHP_conf['db']['default2'][1]['database']              = 't1'; //数据库
$InitPHP_conf['db']['default2'][1]['charset']               = 'utf8'; //数据库编码   
$InitPHP_conf['db']['default2'][1]['pconnect']              = 0; //是否持久链接
 </pre>
<div class="title">
  <h3>多数据链接：</h3>
</div>
<ul>
  <li>应用复杂的时候，可能应用中需要链接多个不同的数据库，这个情况下就需要支持多库链接。</li>
  <li>InitPHP提供了一个简单的解决方案。详细看下面的代码部分：</li>
</ul>
<pre id="PHP" class="prettyprint">
/* 多库链接数据库配置方案 */
$InitPHP_conf['db']['driver']                	 		   = 'mysqli'; //mysql,mysqli 默认必填
$InitPHP_conf['db']['default']['db_type']				   = 2; //0-单个服务器，1-读写分离，2-随机
$InitPHP_conf['db']['default'][0]['host']                  = '127.0.0.1'; //主机
$InitPHP_conf['db']['default'][0]['username']              = 'root'; //数据库用户名
$InitPHP_conf['db']['default'][0]['password']              = '1234562'; //数据库密码
$InitPHP_conf['db']['default'][0]['database']              = 'test'; //数据库
$InitPHP_conf['db']['default'][0]['charset']               = 'utf8'; //数据库编码   
$InitPHP_conf['db']['default'][0]['pconnect']              = 0; //是否持久链接


$InitPHP_conf['db']['test2']['db_type']				  	= 0; //0-单个服务器，1-读写分离，2-随机
$InitPHP_conf['db']['test2'][0]['host']                  = '127.0.0.1'; //主机
$InitPHP_conf['db']['test2'][0]['username']              = 'root'; //数据库用户名
$InitPHP_conf['db']['test2'][0]['password']              = '123456'; //数据库密码
$InitPHP_conf['db']['test2'][0]['database']              = 't1'; //数据库
$InitPHP_conf['db']['test2'][0]['charset']               = 'utf8'; //数据库编码   
$InitPHP_conf['db']['test2'][0]['pconnect']              = 0; //是否持久链接 
/****************************************************************************/

/* DAO使用方法 */
class testaDao extends Dao {
    //多库链接，对应test2的数据库-$InitPHP_conf['db']['test2']
	public function test() {
		$this->init_db('test2')->insert_more(array('username'), array(array('init'),array('woshishen')), 'test');
	}
}
 </pre>
<div class="footer">版权所有：<a href="">http://initphp.com</a> InitPHP (A PHP Framework) By @Aliyun_zhuli</div>
<script src="static/jquery.js" type="text/javascript"></script>
<link href="static/prettify/prettify.css" rel="stylesheet" type="text/css">
<script src="static/prettify/prettify.js" type="text/javascript"></script>
<script type="text/javascript" src="static/comm.js"></script>
</body>
</html>
